package 题目集.并查集.带权并查集;

import java.util.Scanner;

/**
 * 题意：
 * 最开始有n列，每列有一个点，每个点有对应编号。
 *  我们会将某列的所有点，添加到另一列的下方。
 *  求指定两个点之间有多少个点。（如果不在同一列就输出-1）
 */
public class 银河英雄传说 {
    /**
     * 并查集思路：
     *   每个点都是一个集合，每一个点都有一个到自己根集合的距离。
     *   当发生合并时，将老集合的根到新集合的根的距离更新为：新集合的节点数量。并更新 新集合的节点数量。
     *   这时，被移动的集合，只有根节点的距离是正确的，其他节点的距离是错误的。
     *   所以，我们需要在find节点的时候，需要同时更新节点到父节点的距离。
     *   这样，我们既可以知道两个点是否在同一列中，又能快速知道两个点之间的距离。
     */
    static final int N = 30000;
    static int[] parent;    //存储节点对应的父节点
    static int[] d;    //存储节点到父节点的距离
    static int[] size; //存储集合中节点的数量

    /**
     * 节点对应集合的根节点，并更新节点到根节点的距离
     * @return
     */
    public static int find(int x) {
        if (parent[x] == x) {
            return x;
        }
        int p = find(parent[x]);        //找到新的根节点，同时更新老根节点到新根节点的距离
        //更新节点到父节点的距离，注意这里不是d[p]，而是d[parent[x]
        // p是新的根节点。节点到新节点距离是 自己相对于老根节点的距离d[x]+老节点相对于新根节点的距离：d[parent[x]]
        d[x] += d[parent[x]];
        return parent[x] = p;   //将父节点更新为新的根节点
    }

    /**
     * 将c集合作为p的子集合
     * 该方法没有交换率，即 f(c,p) != f(p,c)
     */
    public static void union(int c, int p) {
        int cRoot = find(c);
        int pRoot = find(p);
        if (cRoot == pRoot) {
            return;
        }
        parent[cRoot] = pRoot;
        d[cRoot] = size[pRoot]; //更新节点到父节点的距离
        size[pRoot] += size[cRoot]; //更新集合中节点的数量
//        size[cRoot] = 0;    //清空c集合，(这一步可以不做，因为只会用到根节点的size)
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        parent = new int[N + 1];
        d = new int[N + 1];
        size = new int[N + 1];

        int T = sc.nextInt();
        for (int i = 1; i <= T; i++) {
            parent[i] = i;
            size[i] = 1;
        }
        for (int i = 0; i < T; i++) {
            String ops = sc.next();
            int a = sc.nextInt();
            int b = sc.nextInt();
            switch (ops) {
                case "M":
                    union(a, b);
                    break;
                case "C":
                    if (find(a) != find(b)) {
                        System.out.println(-1);
                    } else {
                        if (a == b) {   //特判
                            System.out.println(0);
                            break;
                        }
                        System.out.println(Math.abs(d[a] - d[b]) - 1);  //-1是因为区间是左开右开的
                    }
                    break;
            }
        }
    }
}
